package com.service.sys;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.common.base.BaseConstant;
import com.common.base.BaseService;
import com.entity.sys.SysDept;
import com.entity.sys.SysRole;
import com.entity.sys.SysUser;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.mapper.sys.SysUserMapper;
import fuhua.com.vo.ExceptionVo;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 用户信息 服务实现类
 */
@Service
public class SysUserService extends BaseService<SysUserMapper, SysUser>{

    @Resource
    private SysDeptService sysDeptService;
    @Resource
    private SysRoleService sysRoleService;

    public SysUser getUser(String id,String name,String phone){
        Map<String,String> map = new HashMap<>();
        String msg = "用户不存在";
        if (StrUtil.isNotBlank(id)){
            map.put("id",id);
        }
        if (StrUtil.isNotBlank(name)){
            map.put("name",name);
        }
        if (StrUtil.isNotBlank(phone)){
            map.put("phone",phone);
            msg = phone+"手机号码不存在或未注册";
        }
        SysUser user = baseMapper.getById(map);
        if (null == user){
            throw new ExceptionVo(1001,msg);
        }
        user.setRoleList(sysRoleService.getByIds(user.getRoleId()));
        return user;
    }

    /**
     * 用户列表分页
     */
    public PageInfo<SysUser> page(Map<String, String> map) {
        sysParams(map,"b.id","a.id", true);
        PageHelper.startPage(Integer.parseInt(map.get("pageNum")),Integer.parseInt(map.get("pageSize")));
        List<SysUser> list = baseMapper.page(map);
        return new PageInfo<>(list);
    }

    /**
     * 校验用户名、手机号码是否唯一
     */
    public boolean checkUserNameAndPhone(String userName,String phone,String id) {
        QueryWrapper<SysUser> queryWrapper = new QueryWrapper();
        if (StrUtil.isNotBlank(userName)){
            queryWrapper.eq("user_name",userName);
        }
        if (StrUtil.isNotBlank(phone)){
            queryWrapper.eq("phone",phone);
        }
        if (StrUtil.isNotBlank(id)){
            queryWrapper.ne("id",id);
        }
        int count = baseMapper.selectCount(queryWrapper);
        return count > 0 ? true : false;
    }

    /**
     * 设置用户的数据范围查询条件：
     * 数据范围（1 所有数据 2 所在部门及子部门数据 3 所在部门数据 4 仅本人数据 5 自定义数据）
     * 问题：关于部门id和name，既然设置了id为什么还要设置name呢？
     * 解释：像用户与部门、角色与部门之间的关联用的是部门id关联。
     *      但是因为我自己这边的业务的原因，有一些表数据的所属部门并不是用部门id来进行关联的，而是直接用部门名称关联，
     *      为了方便以后加业务，拓展，所以我这里把部门名称也一起设置了，这个可以根据实际情况选择要不要设置部门名称，
     */
    public void setDataScope(SysUser user){
        Map<String,String> dataScope = new HashMap<>();
        List<SysRole> roleList = user.getRoleList();
        List<Integer> collect = roleList.stream().map(t -> t.getDataScope()).collect(Collectors.toList());
        // 1-4这几个数字里，数字从小到大，数据范围是越来越小的，比如1包含了2、3、4的范围，2包含了3、4的范围，以此类推。
        // 所以只要在用户拥有的数据范围里面，直接取最小的那个数字的范围就行，其他数字的范围就不用取了。
        if (collect.contains(1)) return;
        if (collect.contains(2)){
            // 获取所在部门及子部门的id和name
            Map<String, String> child = sysDeptService.getChildIdAndName(user.getDeptId());
            if (child != null){
                dataScope.put(BaseConstant.bmjzbmid,child.get("id"));
                dataScope.put(BaseConstant.bmJzbmmc,child.get("name"));
            }
        }else if (collect.contains(4)){
            // 仅本人数据：获取当前用户id，以及获取所在部门的id和name
            dataScope.put(BaseConstant.self,user.getId());
        }else if (collect.contains(5)){// 自定义数据：根据角色id获取关联的部门id
            // 包含了5则是取其他数字的数据范围和5的数据范围的并集
            int index = collect.indexOf(5);
            String roleId = roleList.get(index).getId();
            Map<String,String> query = new HashMap<>();
            query.put("id",roleId);
            List<String> idList = sysDeptService.selectIdListByRoleId(query);   // 根据角色id获取部门id
            List<SysDept> deptList = sysDeptService.listByIds(idList);  // 根据部门id查询部门列表
            if (!deptList.isEmpty()) {
                List<String> c = deptList.stream().map(SysDept::getName).collect(Collectors.toList());
                dataScope.put(BaseConstant.zdymc,StrUtil.join(",", c));
            }
            dataScope.put(BaseConstant.zdyid,StrUtil.join(",", idList));
        }
        dataScope.put(BaseConstant.bmid,user.getDeptId());
        dataScope.put(BaseConstant.bmmc,user.getDeptName());
        user.setDataScope(dataScope);
    }
}
